#include "Fantasma.h"
#include "EscenarioModelo.h"
#include "EstrategiaMovimientoRegresarACueva.h"
#include "EstrategiaMovimientoPersegir.h"
#include "EstrategiaMovimientoEstarEnCueva.h"
#include "FabricaParticipantes.h"
#include <time.h>
#include "Pantalla.h"

#include "Cueva.h"

Fantasma::Fantasma(EstrategiaMovimientoFantasma* unaEstrategiaMovimiento, Punto* unPunto, unsigned int unRadio, bool vivo, Pacman* presaAPerseguir ) : ObjetoVivo(unPunto,unRadio,vivo){
	
    this->presaOriginal = presaAPerseguir;
    this->presa = presaAPerseguir;
    this->estrategiaMovimiento = unaEstrategiaMovimiento;
    this->estrategiaMovimientoOriginal = unaEstrategiaMovimiento;
	this->contador = 0;
    this->regresandoACueva = false;
	this->estaSiendoCazado = false;
}

void Fantasma::vivir(){

    

	if(this->getEstrategiaMovimiento()->esEstrategiaEstarEnCueva()){
        
        double r = rand() % 100;
        
		if(r < 2){
		    this->contador = 0;
		    delete this->getEstrategiaMovimiento();
		    this->setEstrategiaMovimiento(new EstrategiaMovimientoPersegir(this->getPresa(),FabricaParticipantes::velocidadStandardFantasma));
		    this->setPosicion(new Punto(Cueva::getInstance()->getPuntoPuertaAfuera()));
    		
		    Pantalla::getInstance()->refrescarInteriorCasita();
		    this->estaSiendoCazado = false;
			
			//this->setPresa(this->getPresaOriginal());
			//this->getEstrategiaMovimiento()->setPresa(this->getPresaOriginal());
        }
	}else{
		if(this->getEstrategiaMovimiento()->esEstrategiaEstarEnCueva()) 
			this->contador++;
	}


    if(this->getEstrategiaMovimiento()->esEstrategiaVolverACueva() 
		&& this->getPosicion()->equals(Cueva::getInstance()->getPuntoPuertaAfuera()) ){
		
        delete this->getEstrategiaMovimiento();
        this->setEstrategiaMovimiento(new EstrategiaMovimientoEstarEnCueva(this->getPresa(),FabricaParticipantes::velocidadStandardFantasma));
		this->setPosicion(new Punto(Cueva::getInstance()->getPuntoPuertaAdentro()));
		this->contador = 0;
		Pantalla::getInstance()->refrescarPuertaCasita();
        Pantalla::getInstance()->refrescarInteriorCasita();
        this->regresandoACueva = false;
		this->estaSiendoCazado = false;
	}



	Punto* nuevo = this->getEstrategiaMovimiento()->mover(this->getPosicion());
	this->setPosicion(nuevo);

}

EstrategiaMovimientoFantasma* Fantasma::getEstrategiaMovimiento(){
    return this->estrategiaMovimiento;
}

void Fantasma::setEstrategiaMovimiento(EstrategiaMovimientoFantasma* unaEstrategiaMovimiento){
	/*if(this->estrategiaMovimiento)
		delete this->estrategiaMovimiento;
	*/
	this->estrategiaMovimiento = unaEstrategiaMovimiento;
}

void Fantasma::setPresa(Pacman* unaPresa){
	this->presa = unaPresa;
}
    
void Fantasma::colisionarConPacman(ObjetoVivo* unObjetoVivo){
    
    Pacman* elPacman = (Pacman*)unObjetoVivo;
    
	if(this->presa->equals(elPacman)){
        
        if(!this->regresandoACueva){ // Si esta regresando a la cueva na pasa nada que choque con el pacman.
			if(!this->isSiendoCazado()){
                this->presa->matar();
            }else{
            // Aca deberia settear la estrategia de movimiento para regresar a la cueva. Y lo hace. 
			    ObjetoVivo* ov = this->getEstrategiaMovimiento()->getPresa();
			    delete this->getEstrategiaMovimiento();
				EstrategiaMovimientoRegresarACueva* e = new EstrategiaMovimientoRegresarACueva(new Punto(Cueva::getInstance()->getPuntoPuertaAfuera()), ov ,100);
			    this->setEstrategiaMovimiento(e);
                this->regresandoACueva = true;
				// Sumo 500 ptos cuando come un fantasma
				this->presa->getJugador()->getMarcadorActual()->incrementarPuntaje((float)500);
            }
        }

    }

}

void Fantasma::colisionarConFantasma(ObjetoVivo* unObjetoVivo){
    Fantasma* elFantasma = (Fantasma*)unObjetoVivo;
    
    /*
    Hay que cambiar la direccion de movimiento.
    */
	//elFantasma->getEstrategiaMovimiento()->getDireccion()->invertir();

}

Pacman* Fantasma::getPresaOriginal(){
    return this->presaOriginal;
}

Pacman* Fantasma::getPresa(){
    return this->presa;
}

void Fantasma::cambiarALaPresaOriginal(){
    this->presa = this->presaOriginal;            
}

bool Fantasma::isSiguiendoPresaOriginal(){
    return (this->presa == this->presaOriginal);            
}

void Fantasma::volverALaestrategiaMovimientoOriginal(){
    if(this->estrategiaMovimiento != this->estrategiaMovimientoOriginal)
        delete estrategiaMovimiento;

    this->estrategiaMovimiento = this->estrategiaMovimientoOriginal;
}        

void Fantasma::setEstaSiendoCazado(bool valor){
	this->estaSiendoCazado = valor ;
}

void Fantasma::setRegresandoACueva(bool valor){
	this->regresandoACueva = valor ;
}

bool Fantasma::isSiendoCazado(){
	return this->estaSiendoCazado ;
}

bool Fantasma::isRegresandoACueva(){
	return this->regresandoACueva ;
}

Fantasma::~Fantasma(){
	delete this->estrategiaMovimiento;
	delete this->estrategiaMovimientoOriginal;
}